package captcha

import (
	"context"
	"fmt"

	"gitee.com/copylian/lian-go.git/helper/redis"
	"github.com/mojocn/base64Captcha"
)

const (
	// DefaultRedisExpiration 默认过期时间
	DefaultRedisExpiration = 300
	// DefaultRedisPrefixKey 默认前缀
	DefaultRedisPrefixKey = "captcha"
)

// redisStore 验证码resis存储
type redisStore struct {
	Ctx         context.Context
	redisClient *redis.RedisInstance
	expiration  int
	prefixKey   string
}

// NewRedisStore redis客户端实例
func NewRedisStore(ctx context.Context, dbName string) (base64Captcha.Store, error) {
	// 实例化
	rs := new(redisStore)

	// 上下文
	rs.Ctx = ctx

	// 获取redis连接
	rs.redisClient, _ = redis.GetRedisInstance(dbName)

	// 过期时间5min
	rs.expiration = DefaultRedisExpiration

	// 前缀
	rs.prefixKey = DefaultRedisPrefixKey

	// 返回
	return rs, nil
}

// Set 写入
func (rs *redisStore) Set(id string, value string) error {
	// 获取验证码key
	id = rs.getKey(id)

	// 写入key值
	_, err := rs.redisClient.Set(rs.Ctx, id, value, rs.expiration)
	return err
}

// Get 获取
func (rs *redisStore) Get(id string, clear bool) (value string) {
	// 获取验证码key
	id = rs.getKey(id)

	// 获取值
	value, err := rs.redisClient.GetString(rs.Ctx, id)
	if err != nil {
		return value
	}

	// 是否删除
	if clear {
		rs.redisClient.Del(rs.Ctx, id)
	}

	// 返回
	return value
}

// Verify 验证
func (rs *redisStore) Verify(id, answer string, clear bool) bool {
	v := rs.Get(id, clear)
	return v == answer
}

// getKey 获取key
func (rs *redisStore) getKey(id string) string {
	return fmt.Sprintf("%s:%s", rs.prefixKey, id)
}
